package com.gupao.pattern.singleton.Lazy;

import org.omg.CORBA.PUBLIC_MEMBER;

/**
 * 牛逼版 懒汉式 内部类模式
 *
 * 特点： 在外部类被调用的时候内部类才会被加载
 * 内部类一定是要在方法调用之前初始化
 * 巧妙的避免了线程安全问题
 *
 * 这种形式兼顾了饿汉式的内存浪费 ，也兼顾了 synchronized
 * 完美的屏蔽了这两个缺点
 */
public class LasyThree {

    private boolean initialized = false;

    // 默认使用LasyThree 的时候，会先初始化内部类
    // 如果没有使用的话，内部类式不会被加载

    private LasyThree () {

        synchronized (LasyThree.class){
            if (initialized == false){
                initialized = !initialized;
            }else{
                throw  new RuntimeException("单例已经被侵入");
            }
        }
    }

    // 默认是不被加载的
    private static class LasyHolder {

        private static  final  LasyThree LASY_H= new LasyThree();


    }

    /**
     * 每一个关键字都不是多余的
     *
     * static 是为了使用单例的空间共享
     * 保证这个方法不会被重写，重载
     * @return
     */
    public static final LasyThree getInstance (){

        // 在返回结果以前，一定会先加载内部类
        return LasyHolder.LASY_H;
    }


}
